package hn.cch.grammar.java;


import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 由于double在金融领域计算会导致精度问题
 * 使用BigDecimal代替double
 */
public class BigDecimalDemo {

    @Test
    public void test01() {

        // 注意String转BigDecimal要求BigDecimal必须非空

        BigDecimal x = new BigDecimal(5);
        BigDecimal y = new BigDecimal(8);

        System.out.println("add:" + y.add(x));
        System.out.println("sub:" + y.subtract(x));

        System.out.println("multiply:" + x.multiply(y).toPlainString());
        // 除法注意要设置结果精度（保留四位小数）和模式（四舍五入）
        System.out.println("multiply:" + x.divide(y, 4, RoundingMode.HALF_UP).toPlainString());


    }


    public static void test() {

        double value = 123456.789;
        BigDecimal src = new BigDecimal(value);

        BigDecimal dest = src.setScale(2, RoundingMode.HALF_UP);
        // 小数：保留2位，四舍五入
        System.out.println("小数：" + dest.toPlainString());

        // 百分数
        BigDecimal percent = src.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP);
        System.out.println("百分数：" + String.format("%s%%", percent.toPlainString()));

        // 千分位格式
        DecimalFormat decimalFormat = new DecimalFormat("#,###.00");
        System.out.println("千分位格式：" + decimalFormat.format(src.doubleValue()));

    }

}
